package com.celan.year2023.month02.day11;

class Solution {
    public void gameOfLife(int[][] board) {
        int row = board.length, col = board[0].length;
        int[][] res = new int[row][col];
        for (int i = 0; i < row; i++) {
            for (int j = 0; j < col; j++) {
                int cur = board[i][j];
                int cnt = 0;

                //左上角存在
                if (i > 0 && j > 0 && board[i - 1][j - 1] == 1) cnt++;
                //上存在
                if (i > 0 && board[i - 1][j] == 1) cnt++;
                //右上角存在
                if (i > 0 && j < col - 1 && board[i - 1][j + 1] == 1) cnt++;
                //右存在
                if (j < col - 1 && board[i][j + 1] == 1) cnt++;
                //右下角存在
                if (i < row - 1 && j < col - 1 && board[i + 1][j + 1] == 1) cnt++;
                //下存在
                if (i < row - 1 && board[i + 1][j] == 1) cnt++;
                //左下角存在
                if (i < row - 1 && j > 0 && board[i + 1][j - 1] == 1) cnt++;
                //左角存在
                if (j > 0 && board[i][j - 1] == 1) cnt++;

                if (cur == 1) {
                    //如果活细胞周围八个位置的活细胞数少于两个，则该位置活细胞死亡；
                    if (cnt < 2) res[i][j] = 0;
                    //如果活细胞周围八个位置有两个或三个活细胞，则该位置活细胞仍然存活；
                    if (cnt == 2 || cnt == 3) res[i][j] = 1;
                    //如果活细胞周围八个位置有超过三个活细胞，则该位置活细胞死亡；
                    if (cnt > 3) res[i][j] = 0;
                } else {
                    //如果死细胞周围正好有三个活细胞，则该位置死细胞复活；
                    if (cnt == 3) res[i][j] = 1;
                }
            }
        }
        for (int i = 0; i < row; i++) {
            for (int j = 0; j < col; j++) {
                board[i][j] = res[i][j];
            }
        }
    }
}